#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Biomni Web Interface 启动脚本

这个脚本用于启动Biomni的Web界面，提供一个友好的图形化交互界面。

使用方法:
    python start_web.py
    
或者:
    python start_web.py --host 0.0.0.0 --port 6001 --debug
"""

import argparse
import logging  # 新增：导入日志模块
import os
import sys
import webbrowser
from logging.handlers import RotatingFileHandler  # 新增：用于日志轮转
from threading import Timer


# 新增：配置日志
def setup_logger():
    # 确保logs目录存在
    os.makedirs('logs', exist_ok=True)
    
    # 日志格式：时间、级别、模块、消息
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(module)s - %(message)s')

    # 日志文件：最多保留5个文件，每个文件最大10MB
    file_handler = RotatingFileHandler(
        'logs/biomni_web.log',
        maxBytes=10*1024*1024,  # 10MB
        backupCount=5,
        encoding='utf-8'
    )
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)  # 记录INFO及以上级别

    # 控制台输出
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    console_handler.setLevel(logging.INFO)

    # 配置根日志
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger

def open_browser(url):
    """延迟打开浏览器"""
    webbrowser.open(url)

def main():
    # 新增：初始化日志
    logger = setup_logger()

    parser = argparse.ArgumentParser(description='启动Biomni Web界面')
    parser.add_argument('--host', default='0.0.0.0', help='服务器主机地址 (默认: 0.0.0.0)')
    parser.add_argument('--port', type=int, default=int('6001'), help='服务器端口 (默认: 6001)')
    parser.add_argument('--debug', action='store_true', help='启用调试模式')
    parser.add_argument('--no-browser', action='store_true', help='不自动打开浏览器')
    
    args = parser.parse_args()
    
    # 检查是否安装了Flask
    try:
        import flask
    except ImportError:
        logger.error("未安装Flask。请运行以下命令安装依赖:")
        logger.error("pip install -r requirements_web.txt")
        sys.exit(1)
    
    # 检查是否能导入biomni
    try:
        from biomni.agent import A1
    except ImportError:
        logger.error("无法导入biomni模块。请确保已正确安装Biomni。")
        sys.exit(1)
    
    # 导入Flask应用
    try:
        from app import app, auto_initialize_service
    except ImportError:
        logger.error("无法导入app.py。请确保app.py文件存在。")
        sys.exit(1)
    
    # 执行自动初始化
    with app.app_context():
        auto_initialize_service(app)
    
    # 构建URL
    url = f"http://{args.host}:{args.port}"
    
    # 替换所有print为logger.info
    logger.info("="*60)
    logger.info("🧬 Biomni Web Interface")
    logger.info("="*60)
    logger.info(f"🚀 服务器启动中...")
    logger.info(f"🌐 访问地址: {url}")
    logger.info(f"🔧 调试模式: {'开启' if args.debug else '关闭'}")
    logger.info("="*60)
    logger.info("💡 使用说明:")
    logger.info("   1. 在浏览器中打开上述地址")
    logger.info("   2. 配置您的OpenAI API Key和Base URL")
    logger.info("   3. 点击'初始化代理'按钮")
    logger.info("   4. 开始与Biomni代理交互")
    logger.info("="*60)
    logger.info("⚠️  注意: 首次运行时会下载约11GB的数据湖文件")
    logger.info("🛑 按 Ctrl+C 停止服务器")
    logger.info("="*60)
    
    # 延迟打开浏览器
    if not args.no_browser:
        Timer(1.5, open_browser, args=[url]).start()
    
    try:
        # 启动Flask应用
        app.run(
            host=args.host,
            port=args.port,
            debug=args.debug,
            use_reloader=False  # 避免重复打开浏览器
        )
    except KeyboardInterrupt:
        logger.info("\n\n👋 服务器已停止")
    except Exception as e:
        logger.error(f"\n❌ 服务器启动失败: {e}")
        sys.exit(1)

if __name__ == '__main__':
    main()